package javaExample.javaPolymorphism;

/**
 * @author admin 深度理解java的多态
 *
 */
public class JavaPolymorphism {

	public static void main(String[] args) {
		A a1 = new A();
		A a2 = new B();
		B b = new B();
		C c = new C();
		D d = new D();
		System.out.println("1--"+a1.show(b));
		System.out.println("2--"+a1.show(c));
		System.out.println("3--"+a1.show(d));
		System.out.println("4--"+a2.show(b));
		System.out.println("5--"+a2.show(c));
		System.out.println("6--"+a2.show(d));
		System.out.println("7--"+b.show(b));
		System.out.println("8--"+b.show(c));
		System.out.println("9--"+b.show(d));
		/*
		 * 分析： 从上面的程序中我们可以看出 A、B、C、D 存在如下关系。 首先我们分析5，a2.show(c)，a2 是 A
		 * 类型的引用变量，所以 this 就代表了 A，a2.show(c),它在 A 类中找发 现没有找到，于是到 A
		 * 的超类中找(super)，由于 A 没有超类（Object除外），所以跳到第三级，也就是 this.s how((super)O)，C
		 * 的超类有 B、A，所以 (super)O 为 B、A，this 同样是 A，这里在 A 中找到了 show(A ob j)，同时由于 a2
		 * 是 B 类的一个引用且 B 类重写了 show(A obj)，因此最终会调用子类B类的 show(A obj) 方 法，结果也就是 B
		 * and A。
		 */
	}
}
